package model.registro;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;


public class ConversionesTiposDatos {
	
	private static final boolean T = true;
	private static final boolean F = false;
	
	public static int sizeOfInt()
	{
		return Integer.SIZE/8;
	}
	
	
	public static byte[] convertirIntABytes(int xIntAConvertir)
	{
		byte[] bytesResultado = new byte[sizeOfInt()];
		
		bytesResultado[0]=(byte)(xIntAConvertir>>24);
		bytesResultado[1]=(byte)(xIntAConvertir>>16);
		bytesResultado[2]=(byte)(xIntAConvertir>>8);
		bytesResultado[3]=(byte)xIntAConvertir;
		
		return bytesResultado;
	}

	
	public static int convertirBytesAInt(byte[] xBytesAConvertir)
	{
		int intResultado=0;
		intResultado+=((int)(xBytesAConvertir[0])&0xFF)<<24;
		intResultado+=((int)(xBytesAConvertir[1])&0xFF)<<16;
		intResultado+=((int)(xBytesAConvertir[2])&0xFF)<<8;
		intResultado+=((int)(xBytesAConvertir[3])&0xFF)<<0;
		
		return intResultado;		
	}
	
	public static boolean[] ConvertirByteABits(byte xByteAConvertir) {

		boolean[] Salida = new boolean[]{F,F,F,F,F,F,F,F};
		String TempString = new String(Integer.toBinaryString(xByteAConvertir));
		int j=0;
		
		if (xByteAConvertir<0) {
			for (int i=(TempString.length()-8); i<TempString.length(); i++) {
				if (TempString.charAt(i)=='1')
					Salida[j]=T;
				j++;
			}
		}
		else
		{
			for (int i=0;i<TempString.length();i++){			
				if (TempString.charAt(i)=='1')
					Salida[(Salida.length-TempString.length())+i]=T;
			}
		}
		
		return Salida;
	}
		
	public static byte ConvertirBitsAByte(boolean[] xBitsAConvertir) {
				
		byte Salida=0;
		
		if (xBitsAConvertir[0]==T) {
			Salida+=(Math.pow(-2,(xBitsAConvertir.length-1)));
		}

		for (int i=1; i<xBitsAConvertir.length; i++) {
			if (xBitsAConvertir[i]==T)
					Salida+=(Math.pow(2,(xBitsAConvertir.length-1)-i));
		}
		
		return Salida;
	}
	
	public static byte[] ObtenerBytesCaracterUTF16BE(int xIdCaracter) {
		
		int l=0;
		byte[] Salida = new byte[2];
		String BitsNumeroString = new String(Integer.toBinaryString(xIdCaracter));
		boolean[] ArrayBitsNumero=new boolean[]{F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F};

		for (int i=0;i<BitsNumeroString.length();i++){			
			if (BitsNumeroString.charAt(i)=='1')
				ArrayBitsNumero[(ArrayBitsNumero.length-BitsNumeroString.length())+i]=T;
		}
		
		for (int i=0;i<Salida.length;i++) {
			
			boolean[] BitsTemp=new boolean[8];		
			for (int j=0; j<BitsTemp.length;j++) {
				BitsTemp[j]=ArrayBitsNumero[l];			
				l++;
			}
			
			Salida[i]=ConversionesTiposDatos.ConvertirBitsAByte(BitsTemp);
		}
		
		return Salida;
	}
	
	public static int ObtenerIdCaracterUTF16BE(byte[] xBytesCaracter) {
		
		int Salida=0;
		int l=0;
		boolean[] BitsCaracter=new boolean[]{F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F};
		
		l=0;
		for (int i=0;i<xBytesCaracter.length;i++) {
			boolean[] BitsTemp=new boolean[8];
			BitsTemp=ConversionesTiposDatos.ConvertirByteABits(xBytesCaracter[i]);
		
			for (int j=0; j<BitsTemp.length;j++) {
				BitsCaracter[l]=BitsTemp[j];
				l++;
			}
		}
		
		for (int k=0; k<BitsCaracter.length; k++) {
			if (BitsCaracter[k]==T)
				Salida+=(Math.pow(2,(BitsCaracter.length-1)-k));			
		}
		
		return Salida;
	}
	
	public static short BytesToShort(byte[] b) {
		ByteBuffer bb = ByteBuffer.allocate(2);
		bb.order(ByteOrder.LITTLE_ENDIAN);
		bb.put(b[0]);
		bb.put(b[1]);
		return bb.getShort(0);
	}
	
	public static byte[] ShortToBytes (short s) {
		return new byte[]{(byte)(s & 0x00FF),(byte)((s & 0xFF00)>>8)};
	}

}

